package com.zenithmind.classroom.pojo.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.*;
import lombok.Data;

import java.util.List;

/**
 * 课程创建DTO
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Data
@Schema(description = "课程创建DTO")
public class CourseCreateDTO {

    /**
     * 课程标题
     */
    @Schema(description = "课程标题")
    @NotBlank(message = "课程标题不能为空")
    @Size(max = 200, message = "课程标题长度不能超过200字符")
    private String title;

    /**
     * 课程副标题
     */
    @Schema(description = "课程副标题")
    @Size(max = 300, message = "课程副标题长度不能超过300字符")
    private String subtitle;

    /**
     * 课程描述
     */
    @Schema(description = "课程描述")
    @NotBlank(message = "课程描述不能为空")
    private String description;

    /**
     * 课程封面图片URL
     */
    @Schema(description = "课程封面图片URL")
    private String coverImageUrl;

    /**
     * 课程分类ID
     */
    @Schema(description = "课程分类ID")
    @NotBlank(message = "课程分类不能为空")
    private String categoryId;

    /**
     * 课程价格
     */
    @Schema(description = "课程价格")
    @DecimalMin(value = "0.0", message = "课程价格不能为负数")
    private Double price;

    /**
     * 课程难度（1:入门, 2:初级, 3:中级, 4:高级, 5:专家）
     */
    @Schema(description = "课程难度（1:入门, 2:初级, 3:中级, 4:高级, 5:专家）")
    @Min(value = 1, message = "课程难度值不能小于1")
    @Max(value = 5, message = "课程难度值不能大于5")
    private Integer difficulty;

    /**
     * 课程类型（1:录播课程, 2:直播课程, 3:混合课程）
     */
    @Schema(description = "课程类型（1:录播课程, 2:直播课程, 3:混合课程）")
    @Min(value = 1, message = "课程类型值不能小于1")
    @Max(value = 3, message = "课程类型值不能大于3")
    private Integer type;

    /**
     * 课程标签
     */
    @Schema(description = "课程标签")
    private List<String> tags;

    /**
     * 预计学习时长（小时）
     */
    @Schema(description = "预计学习时长（小时）")
    @Min(value = 0, message = "预计学习时长不能为负数")
    private Integer estimatedHours;

    /**
     * 课程介绍视频URL
     */
    @Schema(description = "课程介绍视频URL")
    private String introVideoUrl;

    /**
     * 学习目标
     */
    @Schema(description = "学习目标")
    private String objectives;

    /**
     * 适合人群
     */
    @Schema(description = "适合人群")
    private String targetAudience;

    /**
     * 先修要求
     */
    @Schema(description = "先修要求")
    private String prerequisites;

    /**
     * 课程大纲
     */
    @Schema(description = "课程大纲")
    private List<SyllabusItem> syllabus;

    /**
     * 是否推荐（0-否，1-是）
     */
    @Schema(description = "是否推荐（0-否，1-是）")
    private Integer isRecommend;

    /**
     * 是否热门（0-否，1-是）
     */
    @Schema(description = "是否热门（0-否，1-是）")
    private Integer isHot;

    /**
     * 是否新课程（0-否，1-是）
     */
    @Schema(description = "是否新课程（0-否，1-是）")
    private Integer isNew;

    /**
     * 是否免费（0-付费，1-免费）
     */
    @Schema(description = "是否免费（0-付费，1-免费）")
    private Integer isFree;

    /**
     * 课程有效期（天）
     */
    @Schema(description = "课程有效期（天）")
    @Min(value = 1, message = "课程有效期不能小于1天")
    private Integer validityDays;

    /**
     * 是否立即发布
     */
    @Schema(description = "是否立即发布")
    private Boolean publishNow;

    /**
     * 排序值
     */
    @Schema(description = "排序值")
    private Integer sortOrder;

    /**
     * 课程大纲项
     */
    @Data
    @Schema(description = "课程大纲项")
    public static class SyllabusItem {
        
        /**
         * 标题
         */
        @Schema(description = "标题")
        private String title;
        
        /**
         * 描述
         */
        @Schema(description = "描述")
        private String description;
        
        /**
         * 预计时长（分钟）
         */
        @Schema(description = "预计时长（分钟）")
        private Integer duration;
        
        /**
         * 子项目
         */
        @Schema(description = "子项目")
        private List<SyllabusItem> children;
    }
}
